package ru.susu.algebra.ranks;

import java.math.BigInteger;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;

import ru.susu.algebra.number.MapPrimeNumbersProvider;
import ru.susu.algebra.operation.IOperation;
import ru.susu.algebra.pair.Pair;
import ru.susu.algebra.util.NumberUtilities;

/**
 * Поставщик векторов из степеней простых чисел в разложении чисел по модулю 2 {@link BitSet}.
 * Числа берутся из интервала [1..number] и простые числа оттуда же.
 *
 * @author akargapolov
 * @since: 03.05.2010
 */
public class NumbersBitSetFactorizationProvider implements IOperation<Map<Integer, BitSet>>
{

	/**
	 * @param sources - sources[0] целое число, задает интервал [1..number]
	 * @return мап число->степени простых в разложении
	 */
	@Override
	public Map<Integer, BitSet> performOperation(Object... sources)
	{
		Map<Integer, Integer> primes = new MapPrimeNumbersProvider().performOperation(sources);
		Integer number = (Integer) sources[0];
		Map<Integer, BitSet> result = new HashMap<Integer, BitSet>();
		for (int num = 1; num <= number; num++)
		{
			BitSet bitset = new BitSet(primes.size());
			for (Pair<Integer, Integer> pair : NumberUtilities.factorization(BigInteger.valueOf(num)))
			{
				if (pair.getValue() % 2 == 0)
					continue;

				bitset.set(primes.get(pair.getKey()), true);
			}
			result.put(num, bitset);
		}
		return result;
	}
}
